package img_ocr

import (
	"fmt"
	"github.com/makiuchi-d/gozxing"
	"github.com/makiuchi-d/gozxing/qrcode"
	"goocr/data_treating"
	"goocr/img_ocr/util"
	util2 "goocr/util"
	"image"
	_ "image/jpeg" // 导入支持 JPEG 格式的包
	_ "image/png"  // 导入支持 PNG 格式的包
	"os"
	"strings"
	"time"
)

func handdleOcr(site string) []*util.RoomData {
	imgB64s, err := util.GetAllImageBase64(site)
	if err != nil {
		return nil
	}
	var roomDatas []*util.RoomData
	errPic := []string{}
	tryCount := 2
	for i, b64 := range imgB64s {
		var roomsItem *util.RoomData // 替换为实际的房间项类型
		var err error
		// 检查给定图像文件是否包含二维码
		isErcode, err := IsQRCode(b64.Path)
		if err != nil {
			util2.LogError(fmt.Sprintf("检查给定图像文件是否包含二维码出错:%v", err))
			continue
		}
		if isErcode {
			util2.LogInfo(fmt.Sprintf("第%d张图是二维码，不用处理", i+1))
			continue
		}

		// 尝试最多3次
		for attempt := 0; attempt < tryCount; attempt++ {
			ocrInfo, err := util.OcrImage(b64.Base64Strings)
			if err != nil {
				util2.LogInfo("第%d张图识别失败, 尝试次数：%d, 错误：%s", i+1, attempt+1, err)
				time.Sleep(1 * time.Second) // 等待1秒
				continue                    // 继续下一次尝试
			}

			roomsItem, err = util.GerOcrRsp(ocrInfo)
			if err != nil {
				util2.LogInfo("第%d张图处理失败, 尝试次数：%d, 错误：%s", i+1, attempt+1, err)
				time.Sleep(1 * time.Second) // 等待1秒
				continue                    // 继续下一次尝试
			}

			// 如果两个步骤都成功，跳出重试循环
			break
		}

		// 如果3次尝试后仍然失败，则跳过当前图片
		if err != nil {
			errPic = append(errPic, fmt.Sprintf("pic%d", i+1))
			continue
		}
		if roomsItem == nil {
			//异常图片处理
			path := strings.Replace(b64.Path, "\\", "/", -1)
			util2.LogInfo(fmt.Sprintf("异常图片处理:%v", data_treating.AbnormalPicture(path)))
			continue
		}
		roomDatas = append(roomDatas, roomsItem)
	}

	successRate := float64(len(roomDatas)) / float64(len(imgB64s)) * 100
	util2.LogInfo(fmt.Sprintf("成功率: %.2f%%", successRate))
	return roomDatas
}

// isQRCode 检查给定图像文件是否包含二维码
func IsQRCode(filePath string) (bool, error) {
	// 打开图像文件
	file, err := os.Open(filePath)
	if err != nil {
		return false, err
	}
	defer file.Close()

	// 解码图像
	img, _, err := image.Decode(file)
	if err != nil {
		return false, err
	}

	// 创建二维码读取器
	reader := qrcode.NewQRCodeReader()

	// 转换为二维码可识别的格式
	source := gozxing.NewLuminanceSourceFromImage(img)
	bitmap, _ := gozxing.NewBinaryBitmap(gozxing.NewHybridBinarizer(source))

	// 尝试解码
	_, err = reader.Decode(bitmap, nil)
	if err != nil {
		// 如果解码失败，则认为不是二维码
		return false, nil
	}

	// 成功解码意味着图像是二维码
	return true, nil
}
